/**
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */
#ifndef _RH_PTRTABLE_H
#define _RH_PTRTABLE_H

#include <iostream>
#include <vector>
#include <cstdio>
#include <cstdlib>

#ifndef NOT_FOUND
#	define NOT_FOUND -1
#endif

/**
* Classe que simplesmente lê as tabelas de ponteiros de ZMC
*/
class PtrTable  {
   /**
   * Ponteiro para a rom usada
   */
	FILE* _rom;

   /**
   * Valor usado como base para os ponteiros, que são relativos
   */
	long _base;

   /**
   * Vetor utilizado para armazenar a tabela de ponteiros
   */
	std::vector<long> _tbl;

   /**
   * Usada para ler os ponteiros, este método simplesmente lê um
   * quantidade de bytes de forma invertida e retorna como um único número
	* @param size como a quantidade de bytes a serem lidos
   * @return um número formado pela leitura dos bytes
	*/
	long get_bytes(int size);

public:

   /**
   * Construtor que abre a rom e lê a tabela e ponteiros indicada
   * @param name como o nome da rom a ser examinada
   * @param start como o offset de inicio da tabela
   * @param first indica a partir de qual ponteiro a leitura deve começar
   */
	PtrTable(const char* name, long start = 0x10010, int first = 0);

   /**
   * Destrutor padrão, cuida da limpeza
   */
	~PtrTable();

	/**
   * Retorna a quantidade de ponteiros lidos
   * @return o tamanho da tabela de ponteiros
   */
	long size();

   /**
   * Exibe um relatório dos ponteiros lidos
   */
	void print();

   /**
   * Retorna um ponteiro já armazenado, de acordo com sua posição
   * @param pos como a posição do ponteiro
	* @return o ponteiro na posição indicada
   */
	long get_ptr(std::string::size_type pos);
};

#endif //~ _RH_PTRTABLE_H
